
package gtd;

import java.util.Calendar;
import java.util.List;

public class Estadistico implements Interfaz2{
    
    @Override
    public double duracionMediaTareasAcabadas(List<TareaBean> listaTareasAcabadas){
        if(listaTareasAcabadas == null)
            return 0;
                
        int cantidad = listaTareasAcabadas.size();
        double horas = 0;
        double media;
        
        /* Para cada tarea:
         * Calcula su duración en horas restando ambas fechas tras convertirlas
         * en milisegundos desde el epoch con la función getTime
         */
        for(TareaBean t : listaTareasAcabadas){
            /* Las tareas de la lista pasada deberían tener fin por estar acabadas,
             * pero hay que desconfiar del usuario
             */
            if(t.getFechaFinal()==null){
               System.out.println("Error. Tarea sin fin.");
               return 0;
            }
            
            horas += (t.getFechaFinal().getTime() - t.getFechaInicio().getTime() ) / (1000*60*60);
        }
        
        media = horas / cantidad; // La media estaría en horas
        
        return media;
    }
    
    @Override
    public double duracionMediaProyectosAcabados(List<ProyectoBean> listaProyectosAcabados){
        if(listaProyectosAcabados == null)
            return 0;
                
        int cantidad = listaProyectosAcabados.size();
        double horas = 0;
        double media;
        
        /* Para cada proyecto:
         * Calcula su duración en horas restando ambas fechas tras convertirlas
         * en milisegundos desde el epoch con la función getTime
         */
        for(ProyectoBean p : listaProyectosAcabados){
            /* Los proyectos de la lista pasada deberían tener fin por estar acabadas,
             * pero hay que desconfiar del usuario
             */
            if(p.getFechaFinal()==null){
               System.out.println("Error. Tarea sin fin.");
               return 0;
            }
            
            horas += (p.getFechaFinal().getTime() - p.getFechaInicio().getTime() ) / (1000*60*60);
        }
        
        media = horas / cantidad; // La media estaría en horas
        
        return media;
    }
    
    @Override
    public void histogramaTareasDiaSemana(List<TareaBean> listaTareas){
        if(listaTareas == null){
            System.out.println("Error. Lista nula");
            return;
        }
        
        // La fecha de hoy
        Calendar hoy = Calendar.getInstance();
        int anhoActual = hoy.get(hoy.YEAR);
        int semanaActual = hoy.get(hoy.WEEK_OF_YEAR);
        
        String diaSemana = "";
        int anhoTarea, semanaTarea, diaSemanaTarea;
        
        for(TareaBean t : listaTareas){
            // Obtiene la fecha de la tarea
            Calendar fechaTarea = Calendar.getInstance();
            fechaTarea.setTimeInMillis(t.getFechaFinal().getTime());
            anhoTarea = fechaTarea.get(fechaTarea.YEAR);
            semanaTarea = fechaTarea.get(fechaTarea.WEEK_OF_YEAR);
            diaSemanaTarea = fechaTarea.get(fechaTarea.DAY_OF_WEEK);

            /* Si la tarea se realiza en este mismo año y semana (del año), imprime
             * su información básica, con previo "descifrado" del día de la semana
             */
            if(anhoActual == anhoTarea && semanaActual == semanaTarea){
                switch(diaSemanaTarea){
                    case Calendar.MONDAY:
                        diaSemana = "lunes";
                        break;
                    case Calendar.TUESDAY:
                        diaSemana = "martes";
                        break;
                    case Calendar.WEDNESDAY:
                        diaSemana = "miércoles";
                        break;
                    case Calendar.THURSDAY:
                        diaSemana = "jueves";
                        break;
                    case Calendar.FRIDAY:
                        diaSemana = "viernes";
                        break;
                    case Calendar.SATURDAY:
                        diaSemana = "sábado";
                        break;
                    case Calendar.SUNDAY:
                        diaSemana = "domingo";
                        break;
                }
                
                System.out.println("Tarea " + t.getNombre() + " a realizarse el " + diaSemana);
            }
        }
    }
    
    @Override
    public void histogramaTareasDiaMes(List<TareaBean> listaTareas){
        if(listaTareas == null){
            System.out.println("Error. Lista nula.");
            return;
        }
        
        // La fecha de hoy
        Calendar hoy = Calendar.getInstance();
        int anhoActual = hoy.get(hoy.YEAR);
        int mesActual = hoy.get(hoy.MONTH);
        
        int anhoTarea, mesTarea, diaTarea;
        
        for(TareaBean t : listaTareas){
            // Obtiene la fecha de la tarea
            Calendar fechaTarea = Calendar.getInstance();
            fechaTarea.setTimeInMillis(t.getFechaFinal().getTime());
            anhoTarea = fechaTarea.get(fechaTarea.YEAR);
            mesTarea = fechaTarea.get(fechaTarea.MONTH);
            diaTarea = fechaTarea.get(fechaTarea.DAY_OF_MONTH);

            /* Si la fecha se realiza en este mismo año y, imprime su
             * información básica
             */
            if(anhoActual == anhoTarea && mesActual == mesTarea)
                System.out.println("Tarea " + t.getNombre() + " a realizarse el día " + diaTarea);
        }
    }
    
    @Override
    public List<TareaBean> tareasRealizadasProyecto(ProyectoBean proyecto){
        if(proyecto == null)
            return null;
        
        Interfaz1 accesor = new AccesoDatos();
        
        // Filtra las tareas por su id de Proyecto
        List<TareaBean> lista = accesor.filtrarTareas("idProyecto", proyecto.getId());
        
        /* Conserva solo aquellas tareas que han sido finalizadas, es decir,
         * que su fechaFinal sea anterior a la fecha actual
         */
        for(TareaBean t : lista){
           if(t.getFechaFinal().before(new java.util.Date()))
               lista.remove(t);
        }
        
        return lista;
    }
}
